package com.emerquim.security;

import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.apache.log4j.Logger;
import org.hibernate.HibernateException;

import com.emerquim.persistence.dao.MedicosUsuarios;
import com.emerquim.persistence.dao.PermisosUsuario;
import com.emerquim.persistence.dao.Usuarios;
import com.emerquim.persistence.dao.UsuariosDAO;



/**
 * Dao para implementar la funcionalidad de la busqueda de usuario a la base de datos
 * @author Felipe Criales
 */
public class UserDaoImpl implements UserDao {

	/**
	 * Funcionalidad de log
	 */
	private static final Logger log = Logger.getLogger(UserDaoImpl.class);

	/**
	 * Metodo que encuentra un usuario en la base de datos
	 * @param userName
	 * @author Felipe Criales 
	 */	
	public AppUser findUser(String userName) {
		log.info("Logear usuario: " + userName);
		
		UsuariosDAO usuariosDao = new  UsuariosDAO();
		Set<String> roles = new HashSet<String>();
		AppUser appUser = null;
		Usuarios usuario = null;
		try  {
			List listaUsuarios = usuariosDao.findByUsuario(userName); 
			if(listaUsuarios.size() > 0)
				usuario = (Usuarios) listaUsuarios.get(0);
		}catch  (HibernateException e) {
			log.error("Error al consultar un usuario.", e);			
		}finally  {
			// TODO Porque no se puede cerrar la sesion? Arreglar...
			//usuariosDao.getSession().close();			
		}			
		if(usuario != null){			
			Iterator<PermisosUsuario> it = usuario.getPermisosUsuarios().iterator();
			while(it.hasNext()){
				PermisosUsuario permiso = (PermisosUsuario) it.next();
				roles.add(permiso.getPermiso());				
			}
			appUser = new AppUser(usuario.getUsuario(), usuario.getPrimerNombre(), usuario.getPrimerApellido(), usuario.getClave(), roles);
			appUser.setUsuario(usuario);
			
			// Agregar el medico en caso de que el usaurio sea medico
			Iterator<MedicosUsuarios> it2 = usuario.getMedicosUsuarioses().iterator();
			while(it2.hasNext()){
				MedicosUsuarios medicosUsuarios = (MedicosUsuarios) it2.next();
				appUser.setMedico(medicosUsuarios.getPMedicos());				
			}	
		}
		return appUser;
	}
}
